//devfs.c
#ifndef CONFIG_DEVFS_FS
#define CONFIG_DEVFS_FS  //使用 devfs 和静态的第一个区别
#endif
#ifndef __KERNEL__   //这个模块将用于内核
# define __KERNEL__
#endif
#ifndef MODULE    //这个驱动程序将以模块的方式编译和使用
# define MODULE
#endif
#include <linux/config.h>
#include <linux/module.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/types.h>
#include <linux/proc_fs.h>
#include <linux/fcntl.h>
#include <linux/poll.h>
#include <asm/system.h>
#define DEVICE_NAME "evadevfs" //设备名称为 evad
#define evad_MAJOR 0   //主设备号为 0
#define evad_MINOR 0   //次设备号为 0
static int MAX_BUF_LEN=1024; //缓冲区最大长度 1024
static char drv_buf[1024];  //定义内核缓冲区长度为 1024
static int WRI_LENGTH=0;  //写长度为 0
static void do_write()    //交换数值
{
int i;
int len=WRI_LENGTH;   //定义长度
char tmp;
for(i=0;i<len;i++,len--)  //交换数值
{
tmp=drv_buf[len-1];
drv_buf[len-1]=drv_buf[i];
drv_buf[i]=tmp;
}
}
static ssize_t evad_write(struct file *filp, char *buffer ,size_t count) //写操作
{
if(count>MAX_BUF_LEN)count=MAX_BUF_LEN; //固定最大长度
copy_from_user(drv_buf,buffer,count);    //用户 buffer-〉内核 drv_bufcount 长度
WRI_LENGTH=count;       //写长度
printk("user write data to drivers \n");    //打印信息
do_write();        //调用写操作
return count;    //返回数值
}
static ssize_t evad_read(struct file *filp, char *buffer, size_t count , loff_t *ppos)  //读操作
{
if(count>MAX_BUF_LEN)count=MAX_BUF_LEN; //固定最大长度
copy_to_user(buffer,drv_buf,count); //内核 drv_buf-〉用户 buffercount 长度
printk("user read data from drivers \n");    //打印信息
return count;
}
static int evad_ioctl (struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg)
{
printk("ioctl runing\n"); //打印信息
switch(cmd){
default:break; }
return 0;
}
static int evad_open(struct inode *inode, struct file *file)  //打开设备
{
MOD_INC_USE_COUNT;    //用户次数+1
sprintf(drv_buf,"device open success!\n"); //打印信息
printk("device open success!\n");   //打印信息
return 0;        //成功返回
}
static int evad_release(struct inode *inode , struct file *filp) //关闭设备
{
MOD_DEC_USE_COUNT; //用户次数-1
printk("device release \n");  //打印信息
return 0;     //成功返回
}
static struct file_operations evad_fops= //操作集
{
owner: THIS_MODULE,  //拥有者
write: evad_write,   //写evad_write
read: evad_read,    //读evad_read
ioctl: evad_ioctl,    //io控制evad_ioctl
open: evad_open,   //打开evad_open
release: evad_release, //释放evad_release
};
#ifdef CONFIG_DEVFS_FS //如果定义了 CONFIG_DEVFS_FS
static devfs_handle_t devfs_eva_dir, devfs_evaraw;  //则定义这几个变量
#endif
static int __init evad_init(void)  //初始化设备
{
#ifdef CONFIG_DEVFS_FS //如果定义了 CONFIG_DEVFS_FS
devfs_eva_dir=devfs_mk_dir(NULL,"evad",NULL); //建立设备文件夹
devfs_evaraw=devfs_register(devfs_eva_dir,"0",DEVFS_FL_DEFAULT,evad_MAJOR,evad_MINOR ,S_IFCHR | S_IRUSR | S_IWUSR , &evad_fops,NULL); //建立动态驱动文件
#endif
printk(DEVICE_NAME " initialized\n"); //打印信息
return 0;
}
static void __exit evad_exit (void) //退出设备
{
devfs_unregister(devfs_evaraw);   //注销设备文件
devfs_unregister(devfs_eva_dir);   //注销设备文件所在目录
printk(DEVICE_NAME " unloaded\n");  //打印信息
}
module_init(evad_init); //加载该驱动程序需要执行 evad_init。
module_exit(evad_exit); //退出该驱动程序需要执行 evad_exit。



